/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.buss.core.utils;

import java.io.StringReader;
import java.util.regex.Pattern;
import org.apache.html.dom.HTMLDocumentImpl;
import org.cyberneko.html.parsers.DOMFragmentParser;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.html.HTMLDocument;
import org.xml.sax.InputSource;

/**
 *
 * @author gykl
 */
public class HtmlUtil {

    /**
     * 抽取纯文本信息
     * @param inputHtml
     * @return
     * @throws Exception
     */
    public static String extractText(String inputHtml) throws Exception {
        DOMFragmentParser parser = new DOMFragmentParser();
        HTMLDocument document = new HTMLDocumentImpl();
        DocumentFragment fragment = document.createDocumentFragment();
        try {
            parser.parse(new InputSource(new StringReader(inputHtml)), fragment);
            String txt = getPureText(fragment);
            return StringUtil.htmlDecode(txt);
        }catch(Exception ex){
            System.out.println("XML中存在非法字符!");
        }
        return null;
    }

    public static String getPureText(Node node) {
        if ((!node.hasChildNodes())
                && (XMLUtil.isTextNode(node))) {
            return node.getNodeValue();
        }

        if (isFiltered(node)) {
            return "";
        }

        if (node.hasAttributes()) {
            Node a = node.getAttributes().getNamedItem("style");
            if (a != null) {
                String style = a.getNodeValue();
                Pattern p = Pattern.compile("display\\s*\\:\\s*none", 2);
                if (p.matcher(style).find()) {
                    return "";
                }
            }
        }
        StringBuffer sb = new StringBuffer();
        NodeList list = node.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            Node child = list.item(i);
            String name = child.getNodeName();
            sb.append(getPureText(child));
            sb.append(" ");
            if ((name.equals("TR")) || (name.equals("P")) || (name.equals("DIV"))) {
                sb.append("\n");
            }
        }
        return sb.toString();
    }

    private static boolean isFiltered(Node node) {
        short type = node.getNodeType();
        String name = node.getNodeName();
        if (type == 8) {
            return true;
        }
        if (name.equals("SCRIPT")) {
            return true;
        }
        if (name.equals("LINK")) {
            return true;
        }
        if (name.equals("STYLE")) {
            return true;
        }

        return name.equals("OBJECT");
    }

    public static void main(String[] args) throws Exception {
        String t = "WCMS产品介绍<table border='0' cellpadding='0' cellspacing='0' height='9'width='100%'><tbody><tr><td>&nbsp;</td></tr></tbody></table><table border='0' cellpadding='0' cellspacing='0' height='260'width='100%'<tbody><tr><td valign='top'><div style='line-height: 26px; font-size: 10.5pt;'><b>一、产品简介：</b></div><div style='line-height: 26px; font-size: 10.5pt;'>Wcms内容管理系统（Web Content Management System）是基于云等主流技术研发的一套智能化、组件化、个性化、流程化、标准化和国际化的专业门户内容管理平台，系统提供了从内容采、编、发为生命周期的信息的管理，具有强大的灵活性和扩展性。<br />&nbsp;</div><div style='line-height: 26px; font-size: 10.5pt;'><b>二、产品架构：</b><br /><br /><p style='text-align: center;'><img alt='' border='0' src='http://localhost:8084/wcms/website/nanjing/images/1289392900574.jpg' /></p><p style='text-align: center;'>系统结构图</p></div><div style='line-height: 26px; font-size: 10.5pt;'><b>三、应用领域：</b></div><div style='line-height: 26px; font-size: 10.5pt;'><b>政府门户</b>--政府门户网站群快速架构，电子政务业务系统轻松集成，实现安全、高效、易用的政府内、外网门户信息平台。</div><div style='line-height: 26px; font-size: 10.5pt;'><b>企业门户</b>--快速创建企业形象网站、企业外部网门户，建立起客户、供应商、政府和企业的信息通道，实现提升品牌、降低成本、提高效率、产生增值的企业外部网平台。<br />&nbsp;</div><div style='line-height: 26px; font-size: 10.5pt;'><b>四、产品特点：</b></div><div style='line-height: 26px; font-size: 10.5pt;'><b>功能强大</b><b>--</b>多年的政府、企业的项目实施经验，积累了现成成熟的软件平台，跨操作系统特性，独有的跨网段数据传输技术为复杂网络结构的门户建设提供解决方案，同时组件化的开发模式提供了完善的产品选件，全力帮用户打造完美门户。</div><div style='line-height: 26px; font-size: 10.5pt;'><b>灵活安全</b><b>--</b>面对大型门户高协作性，系统提供异地、异网、不同平台、不同系统的内容数据的协作。保证数据协作的同时进一步提高系统安全系数，采用严格的信息、数据、用户、接口的安全控制机制，结合强大的外部保护方案为用户提供灵活、安全的协作环境。</div><div style='line-height: 26px; font-size: 10.5pt;'><b>扩展性好</b><b>--</b>SOA架构，模块化的设计思路，外挂功能无限集成，方便定制功能的集成，有效地保持了平台的延续性。</div><div style='line-height: 26px; font-size: 10.5pt;'><b>简单易用</b><b>--</b>人性化的界面设计，通用的操作方式，随心定制、向导式的操作引导，完备的在线帮助，人性化的设计细节为您带来绝佳的用户体现。</div></td></tr></tbody></table>";
        System.out.println(HtmlUtil.extractText(t));
    }
}
